#include "user_btn.h"
#include "ebtn.h"

/*定义按键基本属性*/
const ebtn_btn_param_t btn_para_setting = EBTN_PARAMS_INIT(
    20,     //time_debounce:按下稳定时间
    10,     //time_debounce_release:释放稳定时间
    50,     //time_click_pressed_min:最短单击按下时长(即按下时间多久被判定为单机，防止抖动误判)
    500,    //time_click_pressed_max:最长单击按下时长(超过则算作长按)
    300,    //time_click_multi_max:多次单击最大间隔
    500,    //time_keepalive_period:长按事件周期(长按状态下，多长时间执行一次长按事件)
    5      //max_consecutive:最多支持多少连击
);
/*定义静态单按键实例*/
ebtn_btn_t user_buttons[] = {
    EBTN_BUTTON_INIT(USER_BUTTON_1,&btn_para_setting),
    EBTN_BUTTON_INIT(USER_BUTTON_2,&btn_para_setting),
    EBTN_BUTTON_INIT(USER_BUTTON_3,&btn_para_setting),
    EBTN_BUTTON_INIT(USER_BUTTON_4,&btn_para_setting),
    EBTN_BUTTON_INIT(USER_BUTTON_5,&btn_para_setting),
    EBTN_BUTTON_INIT(USER_BUTTON_6,&btn_para_setting)
};
/*定义静态组合按键实例*/
ebtn_btn_combo_t user_combo_btn[] = {
    EBTN_BUTTON_COMBO_INIT(USER_COMBO_BTN_0,&btn_para_setting),
    EBTN_BUTTON_COMBO_INIT(USER_COMBO_BTN_1,&btn_para_setting),
    EBTN_BUTTON_COMBO_INIT(USER_COMBO_BTN_2,&btn_para_setting)
};
/**
 * @brief 状态获取回调函数(1代表活动 0代表非活动)
 * @param struct ebtn_btn *btn
 * @return uint8_t state
 */
uint8_t my_get_btn_state(struct ebtn_btn *btn)
{
    switch(btn->key_id)
    {
        case 0:
            return (HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET);

        case 1:
            return (HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET);

        case 2:
            return (HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin) == GPIO_PIN_RESET);

        case 3:
            return (HAL_GPIO_ReadPin(KEY4_GPIO_Port,KEY4_Pin) == GPIO_PIN_RESET);

        case 4:
            return (HAL_GPIO_ReadPin(KEY5_GPIO_Port,KEY5_Pin) == GPIO_PIN_RESET);

        case 5:
            return (HAL_GPIO_ReadPin(KEY6_GPIO_Port,KEY6_Pin) == GPIO_PIN_RESET);

        default:
            return 0;
    }
}
/**
 * @brief 按键事件处理回调函数
 * @param struct ebtn_btn *btn //按键实例
 * @param ebtn_evt_t evt //事件类型
 * @return none
 */
uint8_t ucled_temp[6] = {0};
uint8_t copy_flag = 0;//复制标志位
void my_handle_btn_event(struct ebtn_btn *btn,ebtn_evt_t evt)
{
    //获取当前按键的ID
    uint16_t user_btn_id = btn->key_id;
    //获取连击次数(仅在ONECLICK事件中生效)
    //uint16_t click_count = ebtn_click_get_count(btn);
    
    switch(evt)
    {
        case EBTN_EVT_ONPRESS://按下事件
            if(user_btn_id == USER_COMBO_BTN_0)//复制当前led状态
            {
                for(uint8_t i = 0;i<6;i++)
                ucled_temp[i] = ucled[i];

                copy_flag = 1;
            }
            if(user_btn_id == USER_COMBO_BTN_1)//粘贴当前led状态
            {
                if(copy_flag == 1)
                {
                    for(uint8_t i = 0;i<6;i++)
                    ucled[i] = ucled_temp[i];
                    copy_flag = 0;
                }
            }
            if(user_btn_id == USER_COMBO_BTN_2)//剪切当前led状态
            {
                for(uint8_t i = 0;i<6;i++)
                ucled_temp[i] = ucled[i];
                for(uint8_t i = 0;i<6;i++)
                ucled[i] = 0;

                copy_flag = 1;
            }
            if(user_btn_id == USER_BUTTON_5)
            {
                ucled[0] ^= 1;
            }
			if(user_btn_id == USER_BUTTON_1)
			{
				user_printf(&huart1,"usart%d",1);
			}
        break;

        case EBTN_EVT_ONRELEASE://抬起事件
            ;
        break;

        case EBTN_EVT_ONCLICK://单击or连击事件
            ;
        break;

        case EBTN_EVT_KEEPALIVE://长按事件
            ;
        break;

        default://未知事件
            
        break;
    }
}
/**
 * @brief 用户按键初始化
 * @param none
 * @return uint8_t 
 */
uint8_t user_key_init(void)
{
    //初始化ebtn库
    ebtn_init(
        user_buttons,       //静态按键数组指针
        EBTN_ARRAY_SIZE(user_buttons),//静态按键数量
        user_combo_btn,//静态组合按键数组指针
        EBTN_ARRAY_SIZE(user_combo_btn),//静态组合按键数量
        my_get_btn_state,//用户自定义状态获取回调函数
        my_handle_btn_event//用户自定义事件处理回调函数
    );

    //配置组合按键
    //1. 获取要组合的按键的内部索引值，其并不一定等于key_id
    int key1_index = ebtn_get_btn_index_by_key_id(USER_BUTTON_1);
    int key2_index = ebtn_get_btn_index_by_key_id(USER_BUTTON_2);
    int key3_index = ebtn_get_btn_index_by_key_id(USER_BUTTON_3);
    int key4_index = ebtn_get_btn_index_by_key_id(USER_BUTTON_4);
    //2. 将按键进行组合
    if(key1_index >= 0 && key2_index >= 0)//确保按键索引值有效
    {
        ebtn_combo_btn_add_btn_by_idx(&user_combo_btn[0],key1_index);
        ebtn_combo_btn_add_btn_by_idx(&user_combo_btn[0],key2_index);

        ebtn_combo_btn_add_btn_by_idx(&user_combo_btn[1],key1_index);
        ebtn_combo_btn_add_btn_by_idx(&user_combo_btn[1],key3_index);

        ebtn_combo_btn_add_btn_by_idx(&user_combo_btn[2],key1_index);
        ebtn_combo_btn_add_btn_by_idx(&user_combo_btn[2],key4_index);
    }
    return 0;
}
/**
 * @brief ebtn运行函数
 * @param none
 * @return none
 */
void btn_task(void)
{
    ebtn_process(HAL_GetTick());
}

